package com.example.tliaswebmanagement.service.impl;

import com.example.tliaswebmanagement.mapper.EmpExprMapper;
import com.example.tliaswebmanagement.mapper.EmpMapper;
import com.example.tliaswebmanagement.pojo.*;
import com.example.tliaswebmanagement.service.EmpService;
import com.example.tliaswebmanagement.utils.JwtUtils;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
@Service
public class EmpServiceImpl implements EmpService {
    //依赖注入
    final EmpMapper empMapper;
    final EmpExprMapper empExprMapper;


    public EmpServiceImpl(EmpMapper empMapper, EmpExprMapper empExprMapper) {
        this.empMapper = empMapper;
        this.empExprMapper = empExprMapper;
    }

//    @Override
//    public PageResult<Emp> pagination(Integer page, Integer pageSize) {
//        Integer count = empMapper.count();
//        Integer start = (page - 1) * pageSize;
//        List<Emp> rows = empMapper.list(start, pageSize);
//        // 封装结果 PageResult
//        return new PageResult<Emp>(count, rows);
//    }

//    --------------------------------------- PageHelper 分页查询  ---------------------------------------
    @Override
    public PageResult<Emp> pagination(EmpQueryParam empQueryParam) {
        // 1. 设置分页参数
        PageHelper.startPage(empQueryParam.getPage(), empQueryParam.getPageSize());
        // 2、 执行查询   注意：PageHelper 仅对紧跟随其后的第一个查询语句进行分页处理
        List<Emp> emplist = empMapper.list(empQueryParam);
        // 3. 解析查询结果并封装
        Page<Emp> p = (Page<Emp>) emplist;

        return new PageResult<Emp>((int) p.getTotal(), p.getResult());
    }

    /**
     * 新增员工
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void insert(Emp emp) {
        // 1.保存员工基本信息
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.insert(emp);

        // 2.保持员工工作信息
        List<EmpExpr> exprList = emp.getExprList();
        // 判断工作经历是否为空
        if(!CollectionUtils.isEmpty(exprList)) {
            // 遍历集合，为 empId 赋值
            exprList.forEach(empExpr -> {
                empExpr.setEmpId(emp.getId());
            });
            empExprMapper.insertBatch(exprList);
        }
    }

    /**
     * 批量删除员工 及其 工作经历
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void delete(List<Integer> ids) {
        // 1. 批量删除员工
        empMapper.deleteByIds(ids);
        // 2. 删除该员工工作经历
        empExprMapper.deleteByExprIds(ids);
    }

    /**
     * 查询回显
     */
    @Override
    public Emp getInfo(Integer id) {
        return empMapper.getById(id);
    }
    /**
     * 修改员工
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void updateById(Emp emp) {
        // 1. 修改员工基础信息
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.updateById(emp);
        // 2. 修改员工工作经历（先删除，后添加）
        empExprMapper.deleteByExprIds(Arrays.asList(emp.getId()) );
        List<EmpExpr> exprList = emp.getExprList();
        if(!CollectionUtils.isEmpty(exprList)) {
            exprList.forEach(empExpr -> empExpr.setEmpId(emp.getId()));
            empExprMapper.insertBatch(exprList);
        }
    }

    /**
     * 查询所有班主任
     */
    @Override
    public List<Emp> findAll() {
        List<Emp> list = empMapper.findAll();
        return list;
    }

    /**
     * 登录信息封装
     */
    @Override
    public Login loginRequest(Emp emp) {
        // 1. 调用 Mapper 接口，查询员工信息
        Emp e = empMapper.findByUsernameAndPassword(emp);
        // 2. 判断员工是否存在， 如果存在， 组装返回登录信息
        if(e != null) {
            log.info("登录成功，员工信息：{}", e);
            // 生成令牌
            Map<String, Object> claims = new HashMap<>();
            claims.put("id", e.getId());
            claims.put("username", e.getUsername());
            String jwt = JwtUtils.generateToken(claims);

            return new Login(e.getId(), e.getUsername(), e.getName(), jwt);
        }
        // 3. 不存在返回 null
        return null;
    }
}
